# 示例: 使用 EnsembleRetriever 实现混合搜索
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
from langchain.retrievers import EnsembleRetriever
# 假设 all_splits 和 vectorstore 已准备好

# 1. 初始化关键词检索器 (Sparse Retriever)
bm25_retriever = BM25Retriever.from_documents(all_splits)
bm25_retriever.k = 3 # 检索3个结果

# 2. 初始化向量检索器 (Dense Retriever)
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

# 3. 初始化 EnsembleRetriever，并设置权重
# weights 参数决定了最终排序时，两种检索器结果的权重
 
ensemble_retriever = EnsembleRetriever(    
    retrievers=[bm25_retriever, vector_retriever],    
    weights=[0.4, 0.6] # 稍微偏重向量搜索的语义理解能力
)

# 4. 使用query = "LangChain中的LCEL是什么?"
retrieved_docs = ensemble_retriever.invoke(query)
nt(f"混合搜索召回了 {len(retrieved_docs)} 个文档。")